'use strict';

module.exports = appInfo => {
  const config = exports = {};

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + '_1532353873691_1398';

  // 添加 view 配置
  config.view = {
    defaultViewEngine: 'nunjucks',
    mapping: {
      '.tpl': 'nunjucks',
    },
  };

  config.news = {
    pageSize: 5,
    serverUrl: 'https://hacker-news.firebaseio.com/v0',
  };

  // 修改框架自带的中间件配置
  config.bodyParser = {
    jsonLimit: '1mb',
    formLimit: '1mb',
    enable: false,
  };

  // 加载koa中间件
  config.compress = {
    threshold: 2048,
  };

  // 判断 User-Agent
  config.robot = {
    ua: [
      /Baiduspider/i,
    ],
  };

  // 数据库配置
  config.mysql = {
    client: {
      // clientId, 获取client实例，需要通过 app.mysql.get('clientId') 获取
      db1: {
        // host
        host: 'mysql.com',
        // 端口号
        port: '3306',
        // 用户名
        user: 'test_user',
        // 密码
        password: 'test_password',
        // 数据库名
        database: 'test',
      },
      db2: {
        // host
        host: 'mysql2.com',
        // 端口号
        port: '3307',
        // 用户名
        user: 'test_user',
        // 密码
        password: 'test_password',
        // 数据库名
        database: 'test',
      },
    },
    // 所有数据库配置的默认值
    default: {
      host: 'localhost',
      port: '3306',
      user: 'root',
      password: 'root',
      database: 'mybatis',
    },
    // 是否加载到 app 上，默认开启
    app: true,
    // 是否加载到 agent 上，默认关闭
    agent: false,
  };

  // 定时任务
  config.schedule = {
    // 每 10 秒执行一次
    interval: '1000000000s',
  };

  // 执行日志
  config.customLogger = {
    scheduleLogger: {
      // consoleLevel: 'NONE',
      // file: path.join(appInfo.root, 'logs', appInfo.name, 'egg-schedule.log'),
    },
  };

  // 自定义统一异常处理
  config.onerror = {
    // 线上页面发生异常时，重定向到这个页面上
    errorPageUrl: '/50x.html',
    all(err, ctx) {
      // 在此处定义针对所有响应类型的错误处理方法
      // 注意，定义了 config.all 之后，其他错误处理方法不会再生效
      ctx.body = 'error';
      ctx.status = 500;
    },
    html(err, ctx) {
      // html hander
      ctx.body = '<h3>error</h3>';
      ctx.status = 500;
    },
    json(err, ctx) {
      // json hander
      ctx.body = { message: 'error' };
      ctx.status = 500;
    },
    jsonp(err, ctx) {
      // 一般来说，不需要特殊针对 jsonp 进行错误定义，jsonp 的错误处理会自动调用 json 错误处理，并包装成 jsonp 的响应格式
    },
  };

  // HTML 请求的 404 响应重定向到指定的页面
  config.notfound = {
    pageUrl: '/404.html',
  };

  // 安全插件开启与关闭配置
  config.security = {
    xframe: {
      enable: true,
    },
    csp: {
      ignore: '/example', // 以便合作商户能够嵌入我们的页面
      xframe: {
        enable: false,
      },
    },
    csrf: {
      useSession: true, // 默认为 false，当设置为 true 时，将会把 csrf token 保存到 Session 中
      cookieName: 'csrfToken', // Cookie 中的字段名，默认为 csrfToken
      sessionName: 'csrfToken', // Session 中的字段名，默认为 csrfToken
      queryName: '_csrf', // 通过 query 传递 CSRF token 的默认字段为 _csrf
      bodyName: '_csrf', // 通过 body 传递 CSRF token 的默认字段为 _csrf
    },
  };

  // 国际化
  config.i18n = {
    defaultLocale: 'zh-CN',
  };

  // 响应压缩
  config.gzip = {
    threshold: 1024, // 小于 1k 的响应体不压缩
    match: '/static',
  };

  // 全局配置中间件
  config.middleware = ['gzip', 'robot', 'compress', 'notfoundHandler'];

  return config;
};
